package com.xxx.springboot.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;

import org.springframework.stereotype.Component;

/**
 * https://www.toutiao.com/i6834109418863329804
 * jdk Filter
 * 实现Filter接口即可，也可以通过@WebFilter注解实现对特定URL拦截。
 * Filter和Interceptor的区别：
 * 1. 实现原理不同：
 * 		过滤器（Filter） 是基于回调函数实现的，FilterChain.doFilter() 方法就是回调方法。
 * 		拦截器（Interceptor）是基于spring的aop（动态代理）来实现的。
 * 2. 使用范围不同：
 * 		过滤器（Filter） 实现的是 javax.servlet.Filter 接口，而这个接口是在Servlet规范中定义的，也就是说过滤器Filter的使用要依赖于Tomcat等容器，导致它只能在web程序中使用。
 *		拦截器（Interceptor） 它是一个Spring组件，并由Spring容器管理，并不依赖Tomcat等容器，是可以单独使用的。
 * 3. 执行时机不同：
 * 		过滤器（Filter） 是在请求进入容器后，但在进入servlet之前进行预处理，请求结束是在servlet处理完以后。
 *		拦截器（Interceptor） 是在请求进入servlet后，在进入Handler之前进行预处理的，Handler中渲染了对应的视图之后请求结束。
 */
@Component
@WebFilter(filterName = "myFilter", urlPatterns = "/test*")
public class MyFilter implements Filter {

	/**
	 * 初始化：
	 * 该方法在容器启动初始化过滤器时被调用，它在 Filter 的整个生命周期只会被调用一次。「注意」：这个方法必须执行成功，否则过滤器会不起作用。
	 */
	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
//		System.out.println("Filter|init 初始化 ");
	}

	/**
	 * 过滤器处理
	 * 容器中的每一次请求都会调用该方法， FilterChain 用来调用下一个过滤器 Filter。
	 */
	@Override
	public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
			throws IOException, ServletException {
//		System.out.println("Filter|doFilter 处理中 ");
		filterChain.doFilter(servletRequest, servletResponse);
//		System.out.println("Filter|doFilter 处理完成 ");
	}

	/**
	 * 当容器销毁 过滤器实例时调用该方法，一般在方法中销毁或关闭资源，在过滤器 Filter 的整个生命周期也只会被调用一次。
	 */
	@Override
	public void destroy() {
//		System.out.println("Filter|destroy 处理");
	}
	
}
